package Annotation;

import java.lang.annotation.*;

/**
 * @Author: 注解是Java5开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类
 * 方法或者变量,提供某些信息提供程序在编译或者运行时使用。
 *
 * JDK提供了很多内置的注解(比如@Override,@Deprecated),同时,我们还可以自定义注解。
 * 注解的解析方法有哪几种？
 * 注解只有被解析之后才会生效,常见的解析方法有两种：
 * 编译期直接扫描：编译器在编译Java代码的时候扫描对应的注解并处理，比如某个方法使用@Override注解
 * 编译器在编译的时候会检测当前的方法是否重写了父类对应的方法。
 * 运行期通过反射处理：像框架中自带的注解(比如Spring框架的@Value @Component)都是通过反射来进行处理的。
 *
 * 何谓SPI:
 *  SPI即Service Provider Interface,字面意思就是：服务提供者的接口,我的理解是：专门提供给服务提供者或者
 *  扩展框架功能的开发者去使用的一个接口。
 *  SPI将服务接口和具体的服务实现分离开来,将服务用方和服务实现者解耦,能够提升程序的扩展性，可维护性。
 *  很多框架都使用了Java的SPI机制,比如：Spring框架 数据库加载驱动 日志接口,以及Dubbo的扩展实现等等。
 *
 * SPI和API区别
 *  当实现方提供了接口和实现，我们可以通过调用实现方的接口从而拥有实现方给我们提供的能力,这就是API。
 *  接口和实现都是放在实现方的包中。调用方用过接口调用实现方的功能，而不需要关系具体的实现细节。
 *  当接口存在于调用方这边时，这就是SPI。由接口调用方确定接口规则,然后由不同的厂商根据这个规则对这个
 *  接口进行实现,从而提供服务。
 *
 *  SPI的优缺点
 *  通过SPI机制能够大大地提高接口设计的灵活性,但是SPI机制也存在一些缺点
 *  需要遍历加载所有的实现类,不能做到按需加载,这样效率还是相对较低的。
 *  当多个ServiceLoader同时load时,会有并发问题。
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
interface override extends Annotation {
}